package priv.conceit.study.book.thread.chapter3.parts3;

/**
 * 3.3
 * 线程的优先级
 * <p>
 * 线程优先级的属性  以及两个方法
 * {@link Thread#priority}
 * {@link Thread#getPriority()}
 * {@link Thread#setPriority(int)}
 * <p>
 * 进程有进程的优先级，线程也同样一样
 * 理论上优先级高的线程会优先得到执行的机会
 * 但是该操作同样也是hint 提示操作
 * -对于root用户 该操作会hint操作系统 负责会忽略该操作
 * -如果cpu比较忙 设置优先级可能会获得更多的cpu时间片，但是闲时几乎不会有什么区别
 * 所以不要在程序设计中企图使用线程优先级绑定某些特定的业务
 * <p>
 * 线程的优先级在1-10之间
 * 如果指定的优先级大于线程组的最大优先级，那么指定的优先级会失效，重置为线程组的最大优先级
 * 线程的默认优先级为5 因为main 线程也是5
 *
 * @author conceit
 * @since 1.0.0, 2019/6/14
 */
public class Priority {


	public static void main(String[] args) {
		//normal(1,10);
		abnormal(1, 9);
	}

	/**
	 * 正常测试 指定优先级
	 *
	 * @param priority1 线程1的优先级
	 * @param priority2 线程2的优先级
	 */
	public static void normal(int priority1, int priority2) {
		Thread t1 = new Thread(() -> System.out.println(Thread.currentThread().getName() + "优先级为" + priority1));
		t1.setPriority(priority1);
		Thread t2 = new Thread(() -> System.out.println(Thread.currentThread().getName() + "优先级为" + priority2));
		t2.setPriority(priority2);
		t2.start();
		t1.start();
	}

	/**
	 * 测试当线程 超过线程组 的最大优先级
	 *
	 * @param maxPriority      线程的最大优先级
	 * @param groupMaxPriority 线程组最大默认优先级
	 */
	public static void abnormal(int maxPriority, int groupMaxPriority) {
		System.out.println("main 线程的Priority-->" + Thread.currentThread().getPriority());

		ThreadGroup threadGroup = new ThreadGroup("custom-threadGroup");
		System.out.println("threadGroup的默认maxPriority-->" + threadGroup.getMaxPriority());

		//设置线程组最大优先级
		threadGroup.setMaxPriority(groupMaxPriority);
		System.out.println("threadGroup的设置后maxPriority-->" + threadGroup.getMaxPriority());


		Thread t1 = new Thread(threadGroup, () -> {
			System.out.println(Thread.currentThread().getName() + "is running...");
			Thread t2 = new Thread(() -> System.out.print("子线程" + "is running..."));
			System.out.println("子线程的优先级" + t2.getPriority());

			//子线程在主线程 启动之后才执行，所以和父线程的优先级保持一致
			t2.start();
		}
		);

		System.out.println("thread 的父线程为-->" + t1.getThreadGroup().getName());

		System.out.println("thread 默认priority-->" + t1.getPriority());
		System.out.println("thread 设置的优先级为-->" + maxPriority);
		t1.setPriority(maxPriority);

		//设置t1最大优先级
		t1.start();

	}


}
